Go 1.18 终于正式发布了,本次版本更新中 Go mod 有个很实用的功能 “multi-module workspaces”. 本篇文章简单介绍下 workspace 的使用方式以及使用场景。 更新 go 1.18 版本,推荐使用 goup[1],做多版本管理很方便。 Go work 使用方式 1. 创建一个工作空间 mkdir workspace cd workspace 2. 在没有 go1.18 之前,只能使用 replace,如下: module example.com/hello_work go 1.17 require github.com/georgehao/gomodtestc /hello_work 会在 workspace 下生成一个 go.work文件 go 1.18 use . /gomodtestc go.work的更改如下: go 1.18 use ( ./gomodtestc .
团队官宣 Go 1.18 正式发布。 下面让我们一起了解下 Go 1.18 为我们带来的新特性吧。 本文主要翻译自 Go 1.18 Release Notes - The Go Programming Language。 1.Introduction to Go 1.18 Go 1.18 是一个重要的版本,包括对语言、工具链的实现、运行时和库的改变。 要从用 go 1.18 构建的二进制文件中读取版本信息,请使用 go version 命令和 go 1.18+ 版本的 debug/buildinfo 包。 在 Go 1.18 中,go fix 可以删除在 go.mod 文件中声明 go 1.18 或更低版本的模块中已被淘汰的 //+build lines。
go 1.18 系列(1)- 变化说明 go 1.18正式发布了,这个版本比较重要,所以需要详细指导这个版本改了些什么。 第一篇是对发布的文档进行了学习,后续会针对比较重要的部分进行详细分析和学习。 包括: 泛型 模糊测试 工作空间 go 1.18 doc Go 1.18 正式发布了!支持泛型、性能优化 语法规范 对语言、工具链的实现、运行时和库的更改,对GO 1兼容。 bug修复 Go 1.18 编译器现在可以正确报告declared but not used在函数文字中设置但从未使用过的变量的错误 Go 1.18 编译器现在在将如 '1' << 32 之类的符文常量表达式作为参数传递给预声明函数 要从使用go1.18 构建的二进制文件中读取版本信息,请使用1.18+ 中的go version命令和 debug/buildinfo包。 由于 Go 1.18 的发布标志着对 Go 1.16 支持的结束,所有支持的 Go 版本现在都可以理解//go:build行了。
尝试翻译下文档https://tip.golang.org/doc/go1.18 1.语言 范型 go1.18 实现了《类型参数提案》描述的范型特性,并且保持了对老版本的向下兼容 https:/ bug修复 在函数作用域中声明但从未使用过的变量, Go 1.18编译器现在可以正常报错。Go 1.18之前,在这种情况下编译器没有报错。 Linux Go 1.18需要Linux内核版本2.6.32或更高版本。 由于编译器中与支持泛型相关的更改,Go 1.18编译速度可能比Go 1.17编译速度慢大约15%。编译代码的执行时间不受影响。我们打算提高Go 1.19中编译器的速度。 处理Go二进制文件的工具应该使用Go 1.18的debug/gosym包来透明地处理新旧二进制文件。 new-asan链接器选项支持新的go命令-asan选项。
本文主要探析Go 1.18版本新特性,希望本文能对此方面感兴趣的开发者们提供一些经验和帮助。 Go官方在今年315悄悄发布了Golang 1.18版本。 其次还包括CPU性能提升20%,但是由于支持了泛型,对比1.17版本Go1.18编译时间可能会慢15-18%。 如何升级GO 1.18 注意: 我这边测试的是Linux环境,为了测试我这边特意安装保留之前的Go1.17版本,在此基础上再安装个Go1.18。 /tools) GO1.18在进行依赖解析时,会优先解析go.work的内容,然后再解析go mod,go.work只会留在本地,不会做远程提交。 《Go Fuzzing》 6.《Go1.18 新特性:多Module工作区模式》 7.
Go 1.18 版本新特性详解Go官方在今年 315 悄悄发布了Golang 1.18 版本。Go 1.18 是一个大型版本,其中包括新功能、性能改进以及我们对该语言的最大更改。 如何升级GO 1.18⚠️注意: 我这边测试的是Linux环境, 为了测试我这边特意安装保留之前的Go1.17版本, 在此基础上再安装个Go1.18其次, 升级go版本需要考虑开发IDE是否支持, 目前我使用的 [1]》进行了大量的讨论和实施,在 Go1.18 正式落地。 性能的优化, 核心库的细微调整, 感兴趣的同学可以阅读一下官方的发布说明:《Go 1.18 Release Notes》参考《Go 1.18 is released!》 Fuzzing》《Go1.18 新特性:多 Module 工作区模式》《Go 1.18 Release Notes》
/go1.18-workspace/mypkg go: creating new go.mod: module github.com/go1.18-workspace/mypkg go: to add 1.18 replace github.com/go1.18-workspace/mypkg => .. module github.com/go1.18-workspace/example go 1.18 require github.com/go1.18-workspace/mypkg v1.0.0 go1.18-workspace/mypkg => .. go version go1.18 darwin/arm64 hanwei@hanweideMacBook-Air go1.18-workspace]$ go work init example mypkg
本系列旨在梳理 Go 的 release notes 与发展史,来更加深入地理解 Go 语言设计的思路。 https://go.dev/doc/go1.19Go 1.19 值得关注的改动:内存模型与原子操作 : Go 的 内存模型(memory model) 已更新,与 C、C++、Java 等语言的 模型 旧方式(Go 1.18 及之前)通常需要直接使用 sync/atomic 包提供的函数,并对基本类型进行操作。 go 命令的改进Go 1.19 对 go 命令进行了多项增强和调整,主要涉及构建过程、环境设置、信息查询等方面。 地址消毒器(Address Sanitizer)改进 :Go 1.18 中引入的 地址消毒器(address sanitizer) 支持现在能更精确地处理函数参数和全局变量。
本文基于Go1.18.1的源码,其实Channel的底层源码从Go1.14到现在的Go1.19之间几乎没有变化,这也是Go最早引入的组件之一,体现了Go并发思想:Do not communicate by Channel结构channel的底层数据结构是hchan,在src/runtime/chan.go 中。 并发原语 — Channel 底层实现 https://halfrost.com/go_channel/#toc-20多图详解Go中的Channel源码 https://www.luozhiyun.com /archives/427更新Go内存模型 https://colobu.com/2021/07/13/Updating-the-Go-Memory-Model/Channels in Go https ://go101.org/article/channel.htmlgo中channel源码剖析 https://boilingfrog.github.io/2020/10/14/go%E4%B8%ADchannel
前言 Go 1.18 版本之后正式引入泛型,它被称作类型参数(type parameters),本文初步介绍 Go 中泛型的使用。 ,从而探索 Go 泛型的优势和不足。 Go 1.18 在 Go1.18 可以通过如下命令安装体验: go install golang.org/dl/go1.18@latest go1.18 download 例1: 泛型版本的求和函数 import 那我们要如何在函数不了解 MyInt 的情况下把它当 int 处理呢, 比较抱歉的是目前在1.18中没办法对这个进行处理。 至少在 1.18 里,我们要忍受泛型中存在的种种不一致。 受制于 Go 类型系统的表达能力,我们无法表示复杂的类型约束,自然也无法实现完备的函数式特性。
本文的分析基于Go1.18.1版本的源码,主要是分析了select编译器优化用到的src/cmd/compile/internal/walk/select.go的walkSelectCases() 函数和多 select是Go在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。1.1 什么是IO多路复用? Go 语言的 select 与操作系统中的 select 比较相似但又不完全相同。 而Go语言的select命令,是用来起一个goroutine协程监听多个Channel(代表多个goroutine)的读写事件,提高从多个Channel获取信息的效率。 而Go语言的select命令,是用来起一个goroutine协程监听多个Channel(代表多个goroutine)的读写事件,提高从多个Channel获取信息的效率。
https://go.dev/doc/go1.18Some Undocumented Changes in Go 1.18 and 1.19Go 1.18 是 Go 语言发展史上的一个重要里程碑,它引入了备受期待的泛型 Go 1.18 修复了这个问题 (Issue #8560)。 原生模糊测试 (Fuzzing) 支持Go 1.18 将模糊测试作为标准库和 go 命令的一部分引入。 由于 Go 1.18 发布意味着 Go 1.16 不再受支持,所有受支持的 Go 版本都理解 //go:build。 因此,在 Go 1.18 中,如果 go.mod 文件声明了 go 1.18 或更高版本,go fix 命令现在会自动移除旧的 // +build 行。
2022年1月31日 Go生态洞察:Go 1.18 Beta 2 详解 摘要 大家好,猫头虎博主来了! 今天我们将一起探讨Go 1.18 Beta 2的新鲜出炉的更新。 引言 Go语言的发展一直是软件界的热点话题,尤其是随着Go 1.18的即将发布,社区的激动心情可见一斑。在本篇博客中,我将详细介绍Go 1.18 Beta 2的新特性,以及它们对开发者的潜在影响。 正文 Go 1.18 Beta 2 的新特性 Go 1.18 Beta 2在泛型、fuzzing和Go工作区模式上做了进一步的优化和改进。 安装和使用 Go 1.18 Beta 2 要安装Go 1.18 Beta 2,可以运行以下命令: go install golang.org/dl/go1.18beta2@latest go1.18beta2 参考资料 官方Go 1.18草稿发布说明:Go 1.18 Release Notes 提交问题或反馈:Go Issue Tracker 总结 本篇文章被收录在我的Go生态洞察专栏中,更多信息请点击这里
2022年1月14日 Go生态洞察:Go 1.18 新教程探索 摘要 大家好,猫头虎博主再次出击! 今天我们要一起探索Go 1.18的两个崭新教程。 在这篇文章中,我们将深入这些教程,探索Go 1.18的新特性。 正文 泛型入门教程 Go 1.18引入了泛型,这是Go语言的一次重大更新。泛型允许我们编写更灵活、更具适应性的代码。 Go 1.18 Beta 1 和发布预告 我们也应该回顾一下上个月发布的Go 1.18 Beta 1,它为我们提供了这些新特性的初步体验。你可以在下载页面上找到它。 参考资料 官方Go 1.18草稿发布说明:Go 1.18 Release Notes 提交问题或反馈:Go Issue Tracker 总结 这篇文章被收录在我的Go生态洞察专栏中,更多信息请点击这里 Go 1.18的即将到来预示着Go编程的一个新时代,泛型和fuzzing将为Go语言带来更多的可能性和安全性。
Go 语言有强大的并发能力,能够简单的通过 go 关键字创建大量的轻量级协程 Goroutine,帮助程序快速执行各种任务,比Java等其他支持多线程的语言在并发方面更为强大,除了会用它,我们还需要掌握其底层原理 ,自己花时间把 GMP 调度器的底层源码学习一遍,才能对它有较为深刻的理解和掌握,本文是自己个人对于 Go语言 GMP 调度器(Go Scheduler)底层原理的学习笔记。 调度器的启动4.1 程序启动流程Go 程序一启动,Go 的运行时 runtime 自带的调度器 scheduler 就开始启动了。 在 Go 调度器的底层原理的学习中,不仅需要亲自花时间去分析源码的细节,更加要大量阅读 Go 开发者的文章,需要用心体会机制设计背后的原因。 深度解密 Go 语言之 scheduler https://qcrao.com/post/dive-into-go-scheduler/
2022年3月15日 Go生态洞察:Go 1.18的重大发布 摘要 嗨,猫头虎博主来了! 今天,我们要聚焦Go语言的一个历史性时刻——Go 1.18的发布! 1.18标志着Go成为第一个将fuzzing完全集成到标准工具链中的主要语言。 工作区模式 (Workspaces) Go 1.18通过引入全新的Go工作区模式,简化了跨多个模块工作的过程。 发布说明 更多关于Go 1.18的详细信息,请参阅发布说明。 总结 本篇文章被收录在我的Go生态洞察专栏中,更多信息请点击这里。 Go 1.18的发布是Go社区的一个巨大里程碑,它为Go程序员提供了更多的工具和可能性,让我们一起享 受编程之旅吧!
01 介绍 Go 官方在 Go v1.11 新增 Go Modules 模式,并一直持续到 Go v1.16,每个版本的 Go Modules 模式都会有一些变化。 直到 Go v1.18 版本新增 Workspaces 模式,解决了 Go Modules 模式的这些问题,本文我们介绍 Workspaces 模式的使用方式。 go 1.19 use ./hello 其中 go 指令,是指定使用 Go 的哪个版本编译项目,类似 go.mod 文件中的 go 指令。 使用 Workspaces 模式 我们使用 Go 1.18 提供的 Workspaces 模式,实现我们的需求。 05 总结 本文我们先叙述使用 Go Modules 模式面临的一些问题,然后介绍 Go v1.18 新增的 Workspaces 模式的使用方式,最后通过示例介绍使用 Workspaces 模式可以解决使用
2022年4月5日 Go生态洞察:Go 1.18的工作空间模式深入解析 摘要 大家好,我是猫头虎博主,今天我们来深入探索Go 1.18新加入的一项闪亮特性——工作空间模式。 引言 Go 1.18的发布为Go语言开发者们带来了一项重要的新特性——工作空间模式。这一新特性不仅提高了模块管理的灵活性,还极大地改善了处理多模块项目的开发体验。 让我们一起探索这个功能如何使我们的Go生态变得更加高效和便捷。 正文 工作空间介绍 Go 1.18引入的工作空间功能,允许开发者在不编辑每个模块的go.mod文件的情况下,同时处理多个模块。 工作空间命令 Go 1.18为工作空间引入了几个新命令: go work sync: 将go.work文件中的依赖推回每个工作空间模块的go.mod文件中。 参考资料 官方 Go 1.18下载页面 Go 1.18发布说明 总结 本文深入探讨了Go 1.18的工作空间模式,这是Go生态中的一个重要里程碑。
01 介绍 在 Go 1.18 之前,Go 语言支持功能测试、基准测试和示例测试,在 Go 项目开发中,使用最多的是功能测试,读者朋友们应该都比较熟悉功能测试的使用方式了。 在 Go 1.18 中,Go 语言新增模糊测试,本文我们介绍模糊测试的使用方式。 02 使用方式 Go 语言的模糊测试,与其他三种测试方式相同,测试文件的文件名以 _test.go 结尾,测试文件中必须导入 testing 包。 与功能测试和性能测试相同,运行模糊测试也是使用 go test 命令,读者朋友们可以运行 go help test或 go help testflag 了解更多。 参考资料: https://go.dev/doc/tutorial/fuzz https://go.dev/security/fuzz/
01 介绍 在 Go v1.18 中,Go 语言新增三个功能,分别是“泛型”、“模糊测试” 和 “工作区”。 本文我们介绍 Go 社区呼声最高的 “泛型” 的使用方式。 综上所述,在 Go v1.18 之前,我们如果想要使用相同的逻辑处理不同类型的变量时,就会比较麻烦。 Go v1.18 新增的“泛型”功能,使这个问题得到解决,避免我们写一些重复代码。 v1.18 新增的“泛型”功能,介绍类型参数的语法和在函数、自定义类型和类型方法中的使用方式。 参考资料: https://go.googlesource.com/proposal/+/HEAD/design/43651-type-parameters.md https://go.dev/blog /intro-generics https://go.dev/blog/when-generics